package Classes;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.filechooser.FileFilter;

import paineis.PainelAbaInformacoesAlgoritmo;
import Splash.MeuSplash;
import estados.arestas.EstadoArestaAlgoritmoComAnimacaoPiscar;
import estados.arestas.EstadoArestaAlgoritmoSemAnimacaoDescoberta;
import estados.arestas.EstadoArestaAlgoritmoSemAnimacaoNaoVisitado;
import estados.arestas.EstadoArestaAlgoritmoSemAnimacaoRetorno;
import estados.arestas.EstadoArestaEdicaoSemAnimacao;
import estados.grafo.GrafoEstadoPercLarg;
import estados.grafo.GrafoEstadoPercProf;
import estados.interfaces.EstadoAresta;
import estados.interfaces.EstadoVertice;
import estados.vertices.EstadoVerticeAlgoritmoSemAnimacaoNaoVisitado;
import estados.vertices.EstadoVerticeAlgoritmoSemAnimacaoVisitado;
import estados.vertices.EstadoVerticeEdicaoSemAnimacaoNaoSelecionado;
import estados.vertices.EstadoVerticeEdicaoSemAnimacaoSelecionado;


public class AplicacaoGUI extends JFrame implements Runnable {
	//ArrayList<GrafoGUI> grafosAbertos ;		//array de janelas internas que contem os grafos abertos, paineis de edição etc...
	GrafoGUI grafoGUIAtual ;
	private Thread t = null ;

	private JDesktopPane desktop ;
	private JSplitPane separadorAbas ;
	private JTabbedPane abas ;
	
	//==componentes da janela principal

	JMenuBar barraDeMenus ;
	JMenu menuArquivo ;
		JMenuItem menuItemNovo ;
		JMenuItem menuItemAbrir ;
		JMenuItem menuItemSalvar ;
		JMenuItem menuItemSair ;
	JMenu menuEditar ;
		JMenuItem menuItemCopiar ;
		JMenuItem menuItemColar ;
		JMenuItem menuItemLimparTela ;
		JMenu menuSelecionarTudo ;
			JMenuItem menuItemSelecionarTodosVertices ;

	JToolBar barraDeFerramentasBotoes ;
		JButton botaoVertice ;
		JButton botaoAresta ;
		JButton botaoSelecao ;
		JButton botaoVerticesBombados ;
		JButton botaoProfundidade ;
		JButton botaoLargura ;
		JButton botaoRemoverVertice;
		JButton botaoRemoverAresta;


	//estruturas internas
	Rectangle2D.Float retanguloSelecaoCaixa = new Rectangle2D.Float() ;
	Point2D.Float pontoAtualIncialRetangulo = new Point2D.Float() ;

	//----Flags dos botos das ferramentas
	
	boolean ferramAtualSelecaoEhCaixa ;
	boolean teclaShiftPressionada ;
	int xAntigo,xNovo,yAntigo,yNovo ;



	//construtor - inicializa os componentes internos (botoes, etc...)
	public AplicacaoGUI() {
		super("Grafo Aplicativo") ;
		
		//--Inicializando Flags
		ferramAtualSelecaoEhCaixa = false  ;

		//--Inicialização da barra de menus e seus componentes

		barraDeMenus = new JMenuBar() ;
		menuArquivo = new JMenu("Arquivo") ;
			menuItemNovo = new JMenuItem ("Novo") ;
			menuItemAbrir = new JMenuItem ("Abrir") ;
			menuItemSalvar = new JMenuItem ("Salvar") ;
			menuItemSair = new JMenuItem("Sair") ;
		menuEditar = new JMenu("Editar") ;
			menuItemCopiar = new JMenuItem("Copiar") ;
			menuItemColar = new JMenuItem("Colar") ;
			menuSelecionarTudo = new JMenu ("Selecionar Tudo") ;
				menuItemSelecionarTodosVertices = new JMenuItem("Vertices");
			menuItemLimparTela = new JMenuItem("Limpar Tela");


		//--Inicializaçãoo da barra de ferramentas e seus componentes

		barraDeFerramentasBotoes = new JToolBar() ;
			botaoVertice = new JButton() ;
			botaoVertice.setToolTipText("Adiciona Vertices (V)");
			botaoAresta = new JButton () ;
			botaoAresta.setToolTipText("Adiciona Arestas (A)");
			botaoSelecao = new JButton () ;
			botaoSelecao.setToolTipText("Seleciona Vertices (SHIFT+CLIQUE)");
			botaoVerticesBombados = new JButton ("VB") ;
			botaoProfundidade = new JButton ();
			botaoProfundidade.setToolTipText("Pecorrer em profundidade");
			botaoLargura = new JButton ();
			botaoLargura.setToolTipText("Pecorrer em largura");
			botaoRemoverVertice = new JButton();
			botaoRemoverVertice.setToolTipText("Remover Vertices (DEL)");
			botaoRemoverAresta = new JButton();
			botaoRemoverAresta.setToolTipText("Remover Arestas (Crtl+A)");
		barraDeFerramentasBotoes.requestFocus() ;

		
		//--Atribuiï¿½oes e configurçõeses dos componentes
		menuArquivo.setMnemonic('a') ;
			menuItemNovo.setMnemonic('n') ;
			menuItemAbrir.setMnemonic('a') ;
			menuItemSair.setMnemonic('s') ;
		menuEditar.setMnemonic('e') ;
			menuItemCopiar.setMnemonic('c') ;
			menuItemColar.setMnemonic('o') ;
			menuSelecionarTudo.setMnemonic('t') ;
				menuItemSelecionarTodosVertices.setMnemonic('v') ;
			menuItemLimparTela.setMnemonic('l') ;

		barraDeMenus.add(menuArquivo) ;
			menuArquivo.add(menuItemNovo) ;
			menuArquivo.add(menuItemAbrir) ;
			menuArquivo.add(menuItemSalvar) ;
 			menuArquivo.add(menuItemSair) ;
		barraDeMenus.add(menuEditar) ;
			menuEditar.add(menuItemCopiar) ;
			menuEditar.add(menuItemColar) ;
				menuEditar.add(menuSelecionarTudo) ;
					menuSelecionarTudo.add(menuItemSelecionarTodosVertices) ;
			menuEditar.add(menuItemLimparTela) ;

			barraDeFerramentasBotoes.add(botaoVertice) ;
			barraDeFerramentasBotoes.add(botaoRemoverVertice);
			barraDeFerramentasBotoes.add(botaoAresta) ;
			barraDeFerramentasBotoes.add(botaoRemoverAresta);
			barraDeFerramentasBotoes.add(botaoSelecao) ;
			barraDeFerramentasBotoes.add(botaoVerticesBombados) ;
			barraDeFerramentasBotoes.add(botaoProfundidade) ;
			barraDeFerramentasBotoes.add(botaoLargura) ;
			barraDeFerramentasBotoes.setOrientation(SwingConstants.VERTICAL);
			
		
		//--inicializacao do desktop de frames internas
		desktop = new JDesktopPane() ;
		desktop.setBackground(new Color(171,171,171)) ;
		
		//--inicializacao do painel background
		
		//--inicializacao das abas
		abas = new JTabbedPane() ;
		abas.addTab("Informações",new PainelAbaInformacoesAlgoritmo(this)) ;

		separadorAbas = new JSplitPane(JSplitPane.VERTICAL_SPLIT,desktop,abas) ;
		separadorAbas.setContinuousLayout(true);

		//--inserindo os componentes da aplicacao
		//painelAbas.add(abas) ;
		this.setJMenuBar(barraDeMenus) ;
		this.getContentPane().add(BorderLayout.WEST,barraDeFerramentasBotoes) ;

		this.getContentPane().add(separadorAbas) ;

		//iframe.setContentPane(rolagem) ;		//quando add o grafo tem q fazer isso



		//--Configurando os Listeners
		menuItemNovo.addActionListener(new ComportamentoMenuItemNovo()) ;
		menuItemAbrir.addActionListener(new ComportamentoMenuItemAbrir()) ;
		menuItemSalvar.addActionListener(new ComportamentoMenuItemSalvar()) ;
		menuItemSair.addActionListener(new ComportamentoMenuItemSair()) ;
		menuItemSelecionarTodosVertices.addActionListener(new ComportamentoMenuItemSelecionarTodosVertices()) ;
		menuItemLimparTela.addActionListener(new ComportamentoMenuItemLimparTela()) ;

		botaoAresta.addActionListener(new ComportamentoBotaoAresta()) ;
		botaoSelecao.addActionListener(new ComportamentoBotaoSelecao()) ;
		botaoVertice.addActionListener(new ComportamentoBotaoVertice()) ;
		botaoVerticesBombados.addActionListener(new ComportamentoBotaoVerticesBombados()) ;
		botaoProfundidade.addActionListener(new ComportamentoBotaoProfundidade()) ;
		botaoLargura.addActionListener(new ComportamentoBotaoLargura()) ;
		botaoRemoverVertice.addActionListener(new ComprotamentoBotaoRemonverVertice());
		botaoRemoverAresta.addActionListener(new ComportamentoBotaoRemoverAresta());

		//--Configurando LookAndFeel
		try {  	
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel") ;
			SwingUtilities.updateComponentTreeUI(this);  
		}catch(Exception e) {  
			e.printStackTrace();  
		} 
		
		
		botaoSelecao.setIcon((new ImageIcon ("c:\\icones\\selecao.jpg"))) ;
		botaoSelecao.setRolloverIcon((new ImageIcon ("c:\\icones\\selecao.jpg"))) ;
		botaoVertice.setIcon((new ImageIcon ("c:\\icones\\vertice.jpg"))) ;
		botaoVertice.setRolloverIcon((new ImageIcon ("c:\\icones\\vertice.jpg"))) ;
		botaoAresta.setIcon((new ImageIcon ("c:\\icones\\aresta.jpg"))) ;
		botaoAresta.setRolloverIcon((new ImageIcon ("c:\\icones\\aresta.jpg"))) ;
		botaoLargura.setIcon((new ImageIcon ("c:\\icones\\largura.jpg"))) ;
		botaoLargura.setRolloverIcon((new ImageIcon ("c:\\icones\\largura.jpg"))) ;
		botaoProfundidade.setIcon((new ImageIcon ("c:\\icones\\profundidade.jpg"))) ;
		botaoProfundidade.setRolloverIcon((new ImageIcon ("c:\\icones\\profundidade.jpg"))) ;
		botaoRemoverVertice.setIcon((new ImageIcon("c:\\icones\\deletarvertice.jpg")));
		botaoRemoverVertice.setRolloverIcon((new ImageIcon("c:\\icones\\deletarvertice.jpg")));
		botaoRemoverAresta.setIcon(new ImageIcon("c:\\icones\\deletararesta.jpg"));


		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
		this.setSize(800,600) ;
		this.setBackground(new Color(171,171,171)) ;
		separadorAbas.setDividerLocation(this.getHeight()-200) ;
		this.setVisible(true) ;

		if (t == null) {
			t = new Thread(this) ;
		}
		t.start() ;
	}

	
	//--gets, sets
	public GrafoGUI getGrafoGUIAtual() {		//retorna a referencia para o grafo
		return this.grafoGUIAtual ;
	}

	public JDesktopPane getDesktop() {
		return this.desktop ;
	}

	public JTabbedPane getAbas() {
		return abas;
	}

	public AplicacaoGUI getAplicacao() {		//necessario para usar em classes internas
		return this ;
	}
	
	
	public void setGrafoAtual(GrafoGUI novoGrafoAtual) {
		this.grafoGUIAtual = novoGrafoAtual ;
	}
	//--Fim gets, sets

	
	
	//classes Internas Listeners

	public class ComportamentoBotaoSelecao implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoSelecao) ;
		}
	}
	
	public class ComportamentoBotaoVertice implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoAddVertices);
		}
	}
	
	public class ComportamentoBotaoAresta implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoAddArestas) ;
			getGrafoGUIAtual().getEstadoAtual().executarAcaoBotao(null,null,null) ;
			/*
			//isso esta certo
			Vertice verticeI,verticeJ ;
			boolean existeArestaLigandoV1eV2 ;
			for (int i = 0 ; i < getGrafoGUIAtual().getVerticesSelecionados().size();i++) {
				for (int j = i+1 ; j < getGrafoGUIAtual().getVerticesSelecionados().size(); j++) {
					verticeI = getGrafoGUIAtual().getVerticesSelecionados().get(i) ;
					verticeJ = getGrafoGUIAtual().getVerticesSelecionados().get(j) ;		
					existeArestaLigandoV1eV2 = false ;	
					for (Aresta areAux : verticeI.getIncidentes()) {
						if (areAux.Oposto(verticeI) == verticeJ) {
							existeArestaLigandoV1eV2 = true ;
							break ;
						}
					}				
					if (!existeArestaLigandoV1eV2) {
						Aresta a = new Aresta(verticeI,verticeJ) ;
						verticeI.getIncidentes().add(a) ;
						verticeJ.getIncidentes().add(a) ;
						getGrafoGUIAtual().getGrafo().getArestas().add(a) ;
					}
				}
			}*/
			getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoSelecao) ;
			//botaoSelecao.requestFocus() ;
			repaint() ;
		}
	}
	
	public class ComportamentoBotaoVerticesBombados implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
		//	estadoAtual = Estado.FER_VERTICES_BOMBADOS ;
		}
	}

	public class ComportamentoBotaoProfundidade implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			if (getGrafoGUIAtual().getVerticesSelecionados().size() == 1) {
				getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoPercProf) ;
			}
		}
	}

	public class ComportamentoBotaoLargura implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			if (getGrafoGUIAtual().getVerticesSelecionados().size() == 1) {
				getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoPercLargura) ;
			}
		}
	}

	public class ComprotamentoBotaoRemonverVertice implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			for (Vertice v: grafoGUIAtual.getVerticesSelecionados()) {
				for (Aresta a: v.getIncidentes()){
					grafoGUIAtual.getGrafo().getArestas().remove(a); 
				}
				grafoGUIAtual.getGrafo().getVertices().remove(v);
			}
			grafoGUIAtual.getVerticesSelecionados().clear();
		repaint();
			
		}
		
	}
	
	public class ComportamentoBotaoRemoverAresta implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {			
			ArrayList<Aresta> vn = new ArrayList<Aresta>();
			for (Vertice v: grafoGUIAtual.getVerticesSelecionados()){
				Iterator<Aresta> itr = v.getIncidentes().iterator();
				while (itr.hasNext()){
					Aresta a = (Aresta) itr.next();
					if (grafoGUIAtual.getVerticesSelecionados().contains(a.Oposto(v))) {
						grafoGUIAtual.getGrafo().getArestas().remove(a);
						vn.add(a);
					}
				}
				v.getIncidentes().removeAll(vn);
			}
			repaint();
		}
		
	}
	
	public class ComportamentoMenuItemSelecionarTodosVertices implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			for (Vertice v : getGrafoGUIAtual().getGrafo().getVertices()) {
				if (!getGrafoGUIAtual().getVerticesSelecionados().contains(v)) {
					v.getVerticeGrafico().setSelecao(true) ;
					EstadoVertice estadoSelecionado = new EstadoVerticeEdicaoSemAnimacaoSelecionado() ;
					estadoSelecionado.setVertice(v) ;
					v.getVerticeGrafico().setEstadoDaPinturaAtual(estadoSelecionado) ;
					getGrafoGUIAtual().getVerticesSelecionados().add(v) ;
				}
			}
			repaint() ;
		}
	}

	public class ComportamentoMenuItemLimparTela implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			getGrafoGUIAtual().getGrafo().getArestas().clear() ;
			getGrafoGUIAtual().getGrafo().getVertices().clear() ;
			getGrafoGUIAtual().getVerticesSelecionados().clear();
			getGrafoGUIAtual().idDefault = 1 ;
			repaint() ;
		}
	}

	public class ComportamentoMenuItemNovo implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			GrafoGUI novoGrafo = new GrafoGUI(new Grafo(),getAplicacao(),true,true,true,true) ;
			novoGrafo.addFocusListener(new ComportamentoJanelaInternaFoco()) ;

			novoGrafo.addKeyListener(new ComportamentoDoTeclado()) ;
			
			desktop.add(novoGrafo,0) ;
			setGrafoAtual(novoGrafo) ;
			novoGrafo.setVisible(true) ;
		}
	}
	
	public class ComportamentoMenuItemAbrir implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			JFileChooser janelaAbrir = new JFileChooser() ;
			janelaAbrir.setMultiSelectionEnabled(true) ;
			janelaAbrir.setFileFilter(new FiltroSer()) ;
			
			janelaAbrir.showOpenDialog(getAplicacao()) ; 		//TODO AQUI o get

			File arquivoAberto = janelaAbrir.getSelectedFile() ;

			try {
				FileInputStream fileEntrada = new FileInputStream(arquivoAberto.getAbsolutePath()) ;
				ObjectInputStream fluxoEntrada = new ObjectInputStream(fileEntrada) ;
				
				GrafoGUI grafoAberto = new GrafoGUI(((Grafo)fluxoEntrada.readObject()),getAplicacao(),true,true,true,true) ;
				grafoAberto.setTitle(arquivoAberto.getName()) ;
				//grafoAberto.estadoAddArestas = new GrafoEstadoAddArestas(grafoAberto,SituacaoT.NENHUM) ;
				//grafoAberto.estadoAddVertices = new GrafoEstadoAddVertices(grafoAberto,SituacaoT.NENHUM) ;
				//grafoAberto.estadoSelecao = new GrafoEstadoSelecao(grafoAberto,SituacaoT.NENHUM) ;
				grafoAberto.addFocusListener(new ComportamentoJanelaInternaFoco()) ;
				//grafoAberto.setAplicacao(getAplicacao()) ;
				//grafoAberto.setEstadoAtual(grafoAberto.estadoSelecao) ;
				setGrafoAtual(grafoAberto) ;
				
				//grafoAberto.setRequestFocusEnabled(true) ;
				grafoAberto.requestFocus() ;
				//getDesktop().add(grafoAberto,0) ;
				getDesktop().add(grafoAberto) ;
				grafoAberto.setVisible(true) ;
				//grafoAberto.grabFocus() ;
			} 
			catch (Exception e) {
				System.out.println("deu pau") ;
			}
			
		}
	}
	
	public class ComportamentoMenuItemSalvar implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			JFileChooser janelaSalvar = new JFileChooser() ;
			janelaSalvar.setFileFilter(new FiltroSer()) ;
			janelaSalvar.setApproveButtonText("Salvar") ;
			janelaSalvar.setApproveButtonToolTipText("Salvar o grafo com o nome");
			janelaSalvar.setDialogTitle("Salvar") ;

			janelaSalvar.showOpenDialog(getAplicacao()) ; 
			File arquivoSalvo = janelaSalvar.getSelectedFile() ;
			
			if (arquivoSalvo != null) {		//se nao tiver cancelado
				//salvando
				try {
					FileOutputStream fileSaida =  new FileOutputStream((arquivoSalvo.getAbsolutePath() + ".ser")) ;
					ObjectOutputStream fluxoSaida = new ObjectOutputStream(fileSaida) ;
					fluxoSaida.writeObject(getGrafoGUIAtual().getGrafo()) ;
					fluxoSaida.close() ;
					getGrafoGUIAtual().setTitle(arquivoSalvo.getName()) ;
				} 
				catch (FileNotFoundException e) {
					System.out.println("ERRO: Arquivo nao encontrado") ;
				} 
				catch (IOException e) {
					System.out.println("ERRO: IOException") ;
					e.printStackTrace();
				}
			}
		}
	}
	
	public class ComportamentoMenuItemSair implements ActionListener {

		public void actionPerformed(ActionEvent arg0) {
			System.exit(0) ;
		}
		
	}
	
	public class ComportamentoJanelaInternaFoco implements FocusListener {

		public void focusGained(FocusEvent ev) {
			setGrafoAtual((GrafoGUI)ev.getComponent()) ;
			getGrafoGUIAtual().requestFocus() ;
		}

		@Override
		public void focusLost(FocusEvent ev) {
			
		}
		
	}
	
	
	public class ComportamentoDoTeclado implements KeyListener {


		@Override
		public void keyTyped(KeyEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void keyPressed(KeyEvent e) {
			int key = e.getKeyCode();
			if (key == KeyEvent.VK_DELETE){
				for (Vertice v: grafoGUIAtual.getVerticesSelecionados()) {
					for (Aresta a: v.getIncidentes()){
						grafoGUIAtual.getGrafo().getArestas().remove(a); 
					}
					grafoGUIAtual.getGrafo().getVertices().remove(v);
				}
				
				grafoGUIAtual.getVerticesSelecionados().clear();
			repaint();
			} else 
			if (key == KeyEvent.VK_V){
				for (Vertice v : grafoGUIAtual.getVerticesSelecionados()) {
					v.getVerticeGrafico().setEstadoPinturaNaoSelecionado() ;
				}
				grafoGUIAtual.getVerticesSelecionados().clear();
				getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoAddVertices);
				repaint();
			} else if (key == KeyEvent.VK_B){
				for (Vertice v : getGrafoGUIAtual().getGrafo().getVertices()) {
					if (!getGrafoGUIAtual().getVerticesSelecionados().contains(v)) {
						v.getVerticeGrafico().setSelecao(true) ;
						getGrafoGUIAtual().getVerticesSelecionados().add(v) ;
					}
				}
				repaint() ;
			}else if (key == KeyEvent.VK_A && e.isControlDown()) {
				for (Vertice v : getGrafoGUIAtual().getGrafo().getVertices()) {
					if (!getGrafoGUIAtual().getVerticesSelecionados().contains(v)) {
						v.getVerticeGrafico().setSelecao(true) ;
						EstadoVertice estadoSelecionado = new EstadoVerticeEdicaoSemAnimacaoSelecionado() ;
						estadoSelecionado.setVertice(v) ;
						v.getVerticeGrafico().setEstadoDaPinturaAtual(estadoSelecionado) ;
						getGrafoGUIAtual().getVerticesSelecionados().add(v) ;
					}
				}
				repaint() ;
				
			}
				else 
			if (key == KeyEvent.VK_A){
				getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoAddArestas) ;
				getGrafoGUIAtual().getEstadoAtual().executarAcaoBotao(null,null,null) ;
				getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoSelecao) ;
				repaint();
			}  
		}

		@Override
		public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub
			
		}
		
	}


	
	
	//--classes internas
	public class FiltroSer extends FileFilter {

		public boolean accept(File f) {
			return (f.getName().toLowerCase().endsWith(".ser") || f.isDirectory()) ;
		}

		public String getDescription() {
			return ("Arquivos SER") ;
		}
		
	}
	
	
	

	public void reunirInformacoes(Vertice atual, EstadoVertice estadoVAtual, Vertice oposto, EstadoVertice estadoVOposto, EstadoAresta estadoArestasIncidentes,Aresta arestaPisca, int linhaAtual) {
		//estruturas que são bidimensionais (atribuem um array uni a cada passo)

		ArrayList<Vertice> listaVerticesVisitadosPassoAtual = new ArrayList<Vertice>() ;
		ArrayList<Vertice> listaVerticesNaoVisitadosPassoAtual = new ArrayList<Vertice>() ;
		
		ArrayList<Aresta> listaArestasDescobertaPassoAtual  = new ArrayList<Aresta>() ;
		ArrayList<Aresta> listaArestasRetornoPassoAtual  = new ArrayList<Aresta>() ;
		ArrayList<Aresta> listaArestasNaoVisitadasPassoAtual  = new ArrayList<Aresta>() ;
		
		
		//INICIO	
		getGrafoGUIAtual().listaVerticesAtuais.add(atual) ;
		getGrafoGUIAtual().listaEstadosVerticesAtuais.add(estadoVAtual) ;
		
		getGrafoGUIAtual().listaVerticesOpostos.add(oposto) ;
		getGrafoGUIAtual().listaEstadosVerticesOpostos.add(estadoVOposto) ;
		
		getGrafoGUIAtual().listaEstadosArestasIncidentes.add(estadoArestasIncidentes) ;
		
		getGrafoGUIAtual().listaArestasEstadoPiscar.add(arestaPisca) ;
		
		getGrafoGUIAtual().listaLinhaAtual.add((double)linhaAtual) ;

		
		
		//criando a lista de vertices visitados de como se encontra o grafo atualmente
		for (Vertice v : getGrafoGUIAtual().getGrafo().getVertices()) {
			if (v.estaVisitado()) {
				listaVerticesVisitadosPassoAtual.add(v) ;
			}
			else {
				listaVerticesNaoVisitadosPassoAtual.add(v) ;	//para o botao retroceder passo
			}
		}

		for (Aresta a : atual.getIncidentes()) {
			if (estadoArestasIncidentes instanceof EstadoArestaAlgoritmoSemAnimacaoNaoVisitado) {
				EstadoAresta novoEstado = new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado() ;
				novoEstado.setAresta(a) ;
				a.getArestaGrafica().setEstadoDaPinturaAtual(novoEstado) ;
			}
			else if (estadoArestasIncidentes instanceof EstadoArestaAlgoritmoSemAnimacaoDescoberta) {
				EstadoAresta novoEstado = new EstadoArestaAlgoritmoSemAnimacaoDescoberta() ;
				novoEstado.setAresta(a) ;
				a.getArestaGrafica().setEstadoDaPinturaAtual(novoEstado) ;
				
			}
			else if(estadoArestasIncidentes instanceof EstadoArestaAlgoritmoSemAnimacaoRetorno) {
				EstadoAresta novoEstado = new EstadoArestaAlgoritmoSemAnimacaoRetorno() ;
				novoEstado.setAresta(a) ;
				a.getArestaGrafica().setEstadoDaPinturaAtual(novoEstado) ;
			}
			else if(estadoArestasIncidentes instanceof EstadoArestaAlgoritmoComAnimacaoPiscar) {
				EstadoAresta novoEstado = new EstadoArestaAlgoritmoComAnimacaoPiscar() ;
				novoEstado.setAresta(a) ;
				a.getArestaGrafica().setEstadoDaPinturaAtual(novoEstado) ;
			}

		}
		
		
		//criando as listas de arestas de descoberta e de retorno de como se encontra o grafo atualmente
		for (Aresta a : getGrafoGUIAtual().getGrafo().getArestas()) {
			if (a.getTipo() == Aresta.TipoAresta.DESCOBERTA) {
				if (a.getArestaGrafica().getEstadoDaPinturaAtual() == null) {
					System.out.println("NULO NULO NULO NULO NULO NULO") ;
				}
				listaArestasDescobertaPassoAtual.add(a) ;
			}
			else if (a.getTipo() == Aresta.TipoAresta.RETORNO) {
				if (a.getArestaGrafica().getEstadoDaPinturaAtual() == null) {
					System.out.println("NULO NULO NULO NULO NULO NULO") ;
				}
				listaArestasRetornoPassoAtual.add(a) ;
			}
			else {
				if (a.getArestaGrafica().getEstadoDaPinturaAtual() == null) {
					System.out.println("NULO NULO NULO NULO NULO NULO") ;
				}
				listaArestasNaoVisitadasPassoAtual.add(a) ;
			}
		}
		
		getGrafoGUIAtual().listaArestasDescoberta.add(listaArestasDescobertaPassoAtual) ;
		getGrafoGUIAtual().listaArestasRetorno.add(listaArestasRetornoPassoAtual) ;
		getGrafoGUIAtual().listaArestasNaoVisitadas.add(listaArestasNaoVisitadasPassoAtual) ;
		getGrafoGUIAtual().listaVerticesVisitados.add(listaVerticesVisitadosPassoAtual) ;
		getGrafoGUIAtual().listaVerticesNaoVisitados.add(listaVerticesNaoVisitadosPassoAtual) ;

	}
	
	public void reproduzirAlgoritmo() {
		int numeroDePassos = getGrafoGUIAtual().listaLinhaAtual.size();	//pega o numero de passos que o algoritmo levou para ajudar na progressBar e reproducao
		int passoAtual = 0 ;
		
		while (true) {

			getGrafoGUIAtual().janelaDosAlgoritmos.acenderLinha((int)((double)getGrafoGUIAtual().listaLinhaAtual.get(passoAtual))) ;
			
			
			for (int j = 0 ; j < getGrafoGUIAtual().listaVerticesVisitados.get(passoAtual).size(); j++) {
				if (getGrafoGUIAtual().listaVerticesVisitados.get(passoAtual).get(j) != null) {
					Vertice verticeVisitado = getGrafoGUIAtual().listaVerticesVisitados.get(passoAtual).get(j) ;
					EstadoVertice estadoVisitado = new EstadoVerticeAlgoritmoSemAnimacaoVisitado() ;
					estadoVisitado.setVertice(verticeVisitado) ;
					verticeVisitado.getVerticeGrafico().setEstadoDaPinturaAtual(estadoVisitado) ;
				}
			}
			
			for (int j = 0 ; j < getGrafoGUIAtual().listaVerticesNaoVisitados.get(passoAtual).size(); j++) {
				if (getGrafoGUIAtual().listaVerticesNaoVisitados.get(passoAtual).get(j) != null) {
					Vertice verticeNaoVisitado = getGrafoGUIAtual().listaVerticesNaoVisitados.get(passoAtual).get(j) ;
					EstadoVertice estadoNaoVisitado = new EstadoVerticeAlgoritmoSemAnimacaoNaoVisitado() ;
					estadoNaoVisitado.setVertice(verticeNaoVisitado) ;
					verticeNaoVisitado.getVerticeGrafico().setEstadoDaPinturaAtual(estadoNaoVisitado) ;
				}
			}
			
			
			if (getGrafoGUIAtual().listaVerticesAtuais.get(passoAtual) != null && getGrafoGUIAtual().listaEstadosVerticesAtuais.get(passoAtual) != null) {
				getGrafoGUIAtual().listaEstadosVerticesAtuais.get(passoAtual).setVertice(getGrafoGUIAtual().listaVerticesAtuais.get(passoAtual)) ;
				getGrafoGUIAtual().listaVerticesAtuais.get(passoAtual).getVerticeGrafico().setEstadoDaPinturaAtual(getGrafoGUIAtual().listaEstadosVerticesAtuais.get(passoAtual)) ;
			}

			if ((getGrafoGUIAtual().listaVerticesOpostos.get(passoAtual) != null) && (getGrafoGUIAtual().listaEstadosVerticesOpostos.get(passoAtual) != null)) {
				getGrafoGUIAtual().listaEstadosVerticesOpostos.get(passoAtual).setVertice((getGrafoGUIAtual().listaVerticesOpostos.get(passoAtual))) ;
				getGrafoGUIAtual().listaVerticesOpostos.get(passoAtual).getVerticeGrafico().setEstadoDaPinturaAtual(getGrafoGUIAtual().listaEstadosVerticesOpostos.get(passoAtual)) ;
			}
			
			
			for (Aresta a : getGrafoGUIAtual().listaVerticesAtuais.get(passoAtual).getIncidentes()) {
				if (a != null && getGrafoGUIAtual().listaEstadosArestasIncidentes.get(passoAtual)!= null) {
					a.getArestaGrafica().setEstadoDaPinturaAtual(getGrafoGUIAtual().listaEstadosArestasIncidentes.get(passoAtual)) ;
				}
			}
	
			
			
			
			for (Aresta a : getGrafoGUIAtual().listaArestasDescoberta.get(passoAtual)) {
				if (a != null) {
					EstadoAresta estadoAresta = new EstadoArestaAlgoritmoSemAnimacaoDescoberta() ;
					
					estadoAresta.setAresta(a) ;
					a.getArestaGrafica().setEstadoDaPinturaAtual(estadoAresta) ;
				}
			}
			
			//seta como retorno as arestas de retorno no momento j
			for (Aresta a : getGrafoGUIAtual().listaArestasRetorno.get(passoAtual)) {
				if (a != null) {
					EstadoAresta estadoAresta = new EstadoArestaAlgoritmoSemAnimacaoRetorno() ;

					estadoAresta.setAresta(a) ;
					a.getArestaGrafica().setEstadoDaPinturaAtual(estadoAresta) ;
				}
			}	
			
			for (Aresta a : getGrafoGUIAtual().listaArestasNaoVisitadas.get(passoAtual)) {
				if (a != null) {
					EstadoAresta estadoAresta = new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado() ;

					estadoAresta.setAresta(a) ;
					a.getArestaGrafica().setEstadoDaPinturaAtual(estadoAresta) ;
				}
			}	
			
			if (getGrafoGUIAtual().listaArestasEstadoPiscar.get(passoAtual) != null) {
				//--seta o estado piscar para a aresta que pisca no passo atual
				EstadoAresta estadoPiscar = new EstadoArestaAlgoritmoComAnimacaoPiscar() ;
				estadoPiscar.setAresta(getGrafoGUIAtual().listaArestasEstadoPiscar.get(passoAtual)) ;
				getGrafoGUIAtual().listaArestasEstadoPiscar.get(passoAtual).getArestaGrafica().setEstadoDaPinturaAtual(estadoPiscar) ;
				//--seta o estado atual
			}
			
			repaint() ;

			getGrafoGUIAtual().janelaDosAlgoritmos.setAvancarPasso(false) ;
			getGrafoGUIAtual().janelaDosAlgoritmos.setPassoAnterior(false) ;
			for (Double l : getGrafoGUIAtual().listaLinhaAtual) {
				System.out.println(l) ;
			}
			while(true) {
				if (getGrafoGUIAtual().janelaDosAlgoritmos.isAvancarPasso()) {
					getGrafoGUIAtual().janelaDosAlgoritmos.apagarLinha((int)((double)getGrafoGUIAtual().listaLinhaAtual.get(passoAtual))) ;
					if (passoAtual < numeroDePassos) {
						passoAtual++ ;
						getGrafoGUIAtual().janelaDosAlgoritmos.botaoProximoPasso.setEnabled(true) ;
						getGrafoGUIAtual().janelaDosAlgoritmos.barraDeProgresso.setValue(passoAtual) ;
						if (passoAtual == numeroDePassos) {
							JOptionPane.showMessageDialog(null,"O percorrimento finalizou, mas nao se desespere, ainda é possivel voltar, você entendem bem o algoritmo?") ;
							getGrafoGUIAtual().janelaDosAlgoritmos.botaoProximoPasso.setEnabled(false) ;
							passoAtual-- ;
						}
					}
					break ;
				}
				else if (getGrafoGUIAtual().janelaDosAlgoritmos.isPassoAnterior()) {
					getGrafoGUIAtual().janelaDosAlgoritmos.apagarLinha((int)((double)getGrafoGUIAtual().listaLinhaAtual.get(passoAtual))) ;
					if (passoAtual > 0) {
						passoAtual--;
						getGrafoGUIAtual().janelaDosAlgoritmos.botaoProximoPasso.setEnabled(true) ;
						getGrafoGUIAtual().janelaDosAlgoritmos.barraDeProgresso.setValue(passoAtual) ;
						break ;
					}
				}
				if (!getGrafoGUIAtual().janelaDosAlgoritmos.isVisible()) {
					getGrafoGUIAtual().limparGravacaoAtual() ; //limpa a gravação atual
					getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoSelecao) ;
					break ;
				}
			}
			
		}
		
		
	}
	
	
	
	public void reunirInformacoes2() {
		
	}
	
	
	
	

	
	public ArrayList<JLabel> lerArquivo(String algoritmo){
		File arquivo = new File(algoritmo) ;
		ArrayList<JLabel> resultado = new ArrayList<JLabel>();
		try{
			FileReader reader = new FileReader(arquivo);
			BufferedReader bufReader = new BufferedReader(reader);
			String s;
			do{
				s = bufReader.readLine();
				if(s != null){
					resultado.add(new JLabel(s));
				}
			}while(s != null);
			bufReader.close();
			reader.close();
		}
		catch(IOException e){
			e.printStackTrace();
		}
		return resultado;
	}
	
	public void run() {
		while (true) {			//laï¿½o principal
			try { Thread.sleep(50) ; } catch (InterruptedException e) { e.printStackTrace(); }
			
			if (getGrafoGUIAtual() != null) {
				if (getGrafoGUIAtual().getEstadoAtual() instanceof GrafoEstadoPercLarg) {
					getGrafoGUIAtual().getEstadoAtual().executarAcaoBotao(null,null,null) ;
					
					getGrafoGUIAtual().janelaDosAlgoritmos = new JanelaAlgoritmo(getGrafoGUIAtual(), getAplicacao(), getAplicacao().lerArquivo("c:\\txtsAlgoritmos\\percursoEmLargura.txt"), "Percurso em Largura") ;
					getGrafoGUIAtual().janelaDosAlgoritmos.setVisible(true) ;
					
					this.reproduzirAlgoritmo() ;
					//getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoSelecao) ;
					getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoSelecao) ;
				}
				else if (getGrafoGUIAtual().getEstadoAtual() instanceof GrafoEstadoPercProf) {
					getGrafoGUIAtual().getEstadoAtual().executarAcaoBotao(null,null,null) ;
					
					getGrafoGUIAtual().janelaDosAlgoritmos = new JanelaAlgoritmo(getGrafoGUIAtual(), getAplicacao(), getAplicacao().lerArquivo("c:\\txtsAlgoritmos\\percursoEmProfundidade.txt"), "Percurso em Profundidade") ;
					getGrafoGUIAtual().janelaDosAlgoritmos.setVisible(true) ;
					
					this.reproduzirAlgoritmo() ;
					//getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoSelecao) ;
					getGrafoGUIAtual().setEstadoAtual(getGrafoGUIAtual().estadoSelecao) ;
				}
			}
		}

/*			if (falseestadoAtual == Estado.FER_PERCURSO_LARGURA) {
				if (getGrafoGUIAtual().getVerticesSelecionados().isEmpty() || getGrafoGUIAtual().getVerticesSelecionados().size() > 1) {
					JOptionPane.showMessageDialog(null,"Por favor, selecione um vertice inicial", "Aviso" ,JOptionPane.WARNING_MESSAGE) ;
				}
				else if (getGrafoGUIAtual().getVerticesSelecionados().size() == 1) {
					
					//janelaDosAlgoritmos.setAlgoritmo(1) ;
					//janelaDosAlgoritmos.setVisible(true) ;
					this.percorrimentoLargura(getGrafoGUIAtual().getVerticesSelecionados().get(0)) ;
				}
				repaint() ;
				//estadoAtual = Estado.FER_SELECAO ;
			}
		}*/

	}



	
	public void preparaPercorrimento() {
		for (Vertice v : getGrafoGUIAtual().getGrafo().getVertices()) {
			EstadoVertice estadoBase = new EstadoVerticeAlgoritmoSemAnimacaoNaoVisitado() ;
			estadoBase.setVertice(v) ;
			v.getVerticeGrafico().setEstadoDaPinturaAtual(estadoBase) ;
			v.setVisitado(false) ;
		}
		for (Aresta a : getGrafoGUIAtual().getGrafo().getArestas()) {
			EstadoAresta estadoBase = new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado() ;
			estadoBase.setAresta(a) ;
			a.getArestaGrafica().setEstadoDaPinturaAtual(estadoBase) ;
			a.setTipo(Aresta.TipoAresta.NAO_VISITADO) ;
		}
		getGrafoGUIAtual().repaint() ;
	}
	
	public void percorrimentoLargura(Vertice v) {
		preparaPercorrimento() ;
		_percorrimentoLargura(v) ;
	}
	

	protected void _percorrimentoLargura(Vertice v) {
		Vertice verticeNulo = new Vertice() ;		
		
		ArrayList<Vertice> fila = new ArrayList<Vertice>() ;
		this.reunirInformacoes(verticeNulo, null, null, null, new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 1);		//situação inicial
		
		fila.add(getGrafoGUIAtual().getGrafo().getVertices().get(0)) ;
		this.reunirInformacoes(verticeNulo, null, null, null, new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 2);
				
		Vertice atual = null ;  //interno

		this.reunirInformacoes(verticeNulo, null, null, null, new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 3);
		while (!fila.isEmpty()) {
			
			atual = fila.remove(0) ;
			this.reunirInformacoes(atual, new EstadoVerticeAlgoritmoSemAnimacaoNaoVisitado(), null, null, new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 4);
			
			this.reunirInformacoes(atual, new EstadoVerticeEdicaoSemAnimacaoSelecionado(), null, null, new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 5);
			if (!atual.estaVisitado()) {
				
				//visitar
				this.reunirInformacoes(atual, null, null, null, new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 6);
				
				atual.setVisitado(true) ;		//visita
				this.reunirInformacoes(atual, new EstadoVerticeAlgoritmoSemAnimacaoVisitado(), null, null, new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 7);
				
				this.reunirInformacoes(atual, new EstadoVerticeAlgoritmoSemAnimacaoVisitado(), null, null, new EstadoArestaEdicaoSemAnimacao(), null, 8);
				for (Aresta a : atual.getIncidentes()) {
					
					this.reunirInformacoes(atual, new EstadoVerticeAlgoritmoSemAnimacaoVisitado(), null, null, new EstadoArestaEdicaoSemAnimacao(), a, 9);
					if (a.getTipo() == Aresta.TipoAresta.NAO_VISITADO) {
						
						Vertice oposto = a.Oposto(atual) ;
						this.reunirInformacoes(atual, new EstadoVerticeAlgoritmoSemAnimacaoVisitado(), oposto, new EstadoVerticeEdicaoSemAnimacaoSelecionado(), null, null, 10);
						
						this.reunirInformacoes(atual, new EstadoVerticeAlgoritmoSemAnimacaoVisitado(), oposto, new EstadoVerticeEdicaoSemAnimacaoSelecionado(), null, null, 11);
						if (!oposto.estaVisitado()) {     //essas duas codiçoes garantem saber
							
							this.reunirInformacoes(atual, new EstadoVerticeAlgoritmoSemAnimacaoVisitado(), oposto, new EstadoVerticeEdicaoSemAnimacaoSelecionado(), null, null, 12);
							if (!fila.contains(oposto)) { //se o vertice ja foi ou esta marcado pra ser visitado
								
								a.setTipo(Aresta.TipoAresta.DESCOBERTA) ;
								this.reunirInformacoes(atual, new EstadoVerticeAlgoritmoSemAnimacaoVisitado(), oposto, new EstadoVerticeAlgoritmoSemAnimacaoNaoVisitado(), null, null, 13);
								//TODO
								fila.add(oposto) ;
								this.reunirInformacoes(atual, new EstadoVerticeAlgoritmoSemAnimacaoVisitado(), oposto, new EstadoVerticeEdicaoSemAnimacaoSelecionado(), null, null, 14);
							}
						}
						else {
							a.setTipo(Aresta.TipoAresta.RETORNO) ;
							this.reunirInformacoes(atual, new EstadoVerticeAlgoritmoSemAnimacaoVisitado(), oposto, null, null, null, 17);
						}
					}
				}
			}
		}
	}
	
	
	
	
	
	
	
	
	public class ControladorBarraRolagem extends JComponent {
		public ControladorBarraRolagem(int larg, int alt) {
			this.setPreferredSize(new Dimension(larg,alt)) ;
			this.setSize(new Dimension(larg,alt)) ;
		}
		
		public void setSizeTam(int x, int y) {
			this.setSize(x,y) ;
			this.setPreferredSize(new Dimension(x,y)) ;
		}
	}

	
	public void percorrimentoProfundidade(Vertice v) {
		preparaPercorrimento() ;
		_percorrimentoProfundidade(v) ;
	}
	
	protected void _percorrimentoProfundidade(Vertice v) {
		Vertice verticeNulo = new Vertice() ;		

		this.reunirInformacoes(v, new EstadoVerticeEdicaoSemAnimacaoSelecionado(), null, null, new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 1);
		if (!v.estaVisitado()) {
			
			this.reunirInformacoes(v, new EstadoVerticeEdicaoSemAnimacaoSelecionado(), null, null, new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 2);
			
			v.setVisitado(true) ;		//VISITAR AQUI
			this.reunirInformacoes(v, new EstadoVerticeAlgoritmoSemAnimacaoVisitado(), null, null, new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 3);

			this.reunirInformacoes(v, null, null, null, new EstadoArestaEdicaoSemAnimacao(), null, 4);
			for (Aresta a : v.getIncidentes()) {
				
				this.reunirInformacoes(v, null, null, null, null, a, 5);
				if (a.getTipo() == Aresta.TipoAresta.NAO_VISITADO) {
					
					Vertice w = a.Oposto(v) ;
					this.reunirInformacoes(v, null, w, new EstadoVerticeEdicaoSemAnimacaoSelecionado(),null, null, 6);
					
					this.reunirInformacoes(v, null, w, new EstadoVerticeEdicaoSemAnimacaoSelecionado(),null, null, 7);
					if (w.estaVisitado()) {
						
						a.setTipo(Aresta.TipoAresta.RETORNO) ;
						this.reunirInformacoes(v, null, w, new EstadoVerticeAlgoritmoSemAnimacaoVisitado(), null , null, 8);
					}
					else {
						a.setTipo(Aresta.TipoAresta.DESCOBERTA) ;
						this.reunirInformacoes(v, null, w, new EstadoVerticeAlgoritmoSemAnimacaoNaoVisitado(), null , null, 10);
					}

					this.reunirInformacoes(v, null, w, new EstadoVerticeEdicaoSemAnimacaoSelecionado(), new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 12);
					_percorrimentoProfundidade(w) ;
				}
			}
		}
		
		this.reunirInformacoes(v, null, null, null, new EstadoArestaAlgoritmoSemAnimacaoNaoVisitado(), null, 0);
	}

	
	
	public static void main (String[] args) {
		MeuSplash mySplash = new MeuSplash();
		String[] a2 = {"Carregando Pastas", "Carregando Imagens", "Carregando Interface","Carregando Arquivos"};
		int i = 2;
		for (int j = 1; j <= 200; j++){
			if (j%49 == 7) {
				//System.out.println ("fajdshnajhsd");
				mySplash.TextoDinamico.setText(a2[j%4]);
			}
			try {
				Thread.sleep(20);
			} catch (Exception e){}
			
		}
		mySplash.dispose();
		AplicacaoGUI g = new AplicacaoGUI() ;
	}
}



